isf 0.1.0

Parsing, Deserialization and Serialization of the Interactive Shader Format.
Documentation
/*{
    "CATEGORIES": [
        "Glitch",
        "Feedback"
    ],
    "CREDIT": "by VIDVOX",
    "INPUTS": [
        {
            "NAME": "inputImage",
            "TYPE": "image"
        },
        {
            "LABEL": "Flush Buffer",
            "NAME": "resetInput",
            "TYPE": "event"
        },
        {
            "DEFAULT": 0.25,
            "LABEL": "Adapt Rate",
            "MAX": 1,
            "MIN": 0,
            "NAME": "adaptLevel",
            "TYPE": "float"
        },
        {
            "DEFAULT": 1,
            "LABEL": "Sort Rate",
            "MAX": 1,
            "MIN": 0,
            "NAME": "sortRate",
            "TYPE": "float"
        },
        {
            "DEFAULT": 1,
            "LABEL": "H Sort",
            "NAME": "horizontalSort",
            "TYPE": "bool"
        },
        {
            "DEFAULT": 1,
            "LABEL": "V Sort",
            "NAME": "verticalSort",
            "TYPE": "bool"
        }
    ],
    "ISFVSN": "2",
    "PASSES": [
        {
            "PERSISTENT": true,
            "TARGET": "lastRender"
        }
    ]
}
*/

#if __VERSION__ <= 120
varying vec2 left_coord;
varying vec2 right_coord;
varying vec2 above_coord;
varying vec2 below_coord;
#else
in vec2 left_coord;
in vec2 right_coord;
in vec2 above_coord;
in vec2 below_coord;
#endif



void main()
{
	vec4 result = vec4(0.0);
	vec4 color = IMG_THIS_NORM_PIXEL(inputImage);
	//float localAdaptRate = 1.0 - pow(adaptLevel,2.0);
	float localAdaptRate = adaptLevel;
	//	if the frame index is 0, or the reset event was triggered, use the original color
	if ((FRAMEINDEX <= 1)||(resetInput))	{
		result = color;
	}
	else	{
		vec4 oldColor = IMG_THIS_NORM_PIXEL(lastRender);
		color = mix(color, oldColor, localAdaptRate);
		result = color;
		float	b0 = (color.r + color.b + color.g) / 3.0;

		if (verticalSort)	{
			vec4 colorA = IMG_NORM_PIXEL(lastRender, above_coord);
			vec4 colorB = IMG_NORM_PIXEL(lastRender, below_coord);
			float	bA = (colorA.r + colorA.b + colorA.g) / 3.0;
			float	bB = (colorB.r + colorB.b + colorB.g) / 3.0;
			float	localSortRate = sortRate;
			//	if this pixel is brighter to the one on the left, we are swapping with it
			if (b0 < bA)	{
				result = mix(result, colorA, localSortRate);
			}
			//	if this pixel is not as bright as the one to the right, we are swapping with it
			if (b0 > bB)	{
				result = mix(result, colorB, localSortRate);
			}
		}
		if (horizontalSort)	{
			vec4	colorL = IMG_NORM_PIXEL(lastRender, left_coord);
			vec4	colorR = IMG_NORM_PIXEL(lastRender, right_coord);
			float	bL = (colorL.r + colorL.b + colorL.g) / 3.0;
			float	bR = (colorR.r + colorR.b + colorR.g) / 3.0;
			float	localSortRate = (verticalSort) ? 0.5 : 1.0;
			localSortRate = localSortRate * sortRate;
			//	if this pixel is brighter to the one on the left, we are swapping with it
			if (b0 > bL)	{
				result = mix(result, colorL, localSortRate);
			}
			//	if this pixel is not as bright as the one to the right, we are swapping with it
			if (b0 < bR)	{
				result = mix(result, colorR, localSortRate);
			}
		}
	}	
	gl_FragColor = result;
}